package com.example.resultinterceptor.controller;

import com.example.resultinterceptor.entity.dto.ResultDTO;
import com.example.resultinterceptor.entity.po.User;
import com.example.resultinterceptor.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 根据ID获取用户信息
     */
    @GetMapping("/{id}")
    public ResultDTO<User> getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id);
        if (user != null) {
            return new ResultDTO<>(200, "查询成功", user);
        } else {
            return new ResultDTO<>(404, "用户不存在", null);
        }
    }

    /**
     * 根据用户名获取用户信息
     */
    @GetMapping("/username/{username}")
    public ResultDTO<User> getUserByUsername(@PathVariable String username) {
        User user = userService.getUserByUsername(username);
        if (user != null) {
            return new ResultDTO<>(200, "查询成功", user);
        } else {
            return new ResultDTO<>(404, "用户不存在", null);
        }
    }

    /**
     * 根据邮箱获取用户信息
     */
    @GetMapping("/email/{email}")
    public ResultDTO<User> getUserByEmail(@PathVariable String email) {
        User user = userService.getUserByEmail(email);
        if (user != null) {
            return new ResultDTO<>(200, "查询成功", user);
        } else {
            return new ResultDTO<>(404, "用户不存在", null);
        }
    }

    /**
     * 获取所有激活用户列表
     */
    @GetMapping("/active")
    public ResultDTO<List<User>> getActiveUsers() {
        List<User> users = userService.getActiveUsers();
        return new ResultDTO<>(200, "查询成功", users);
    }

    /**
     * 根据昵称模糊查询用户
     */
    @GetMapping("/search")
    public ResultDTO<List<User>> getUsersByNickname(@RequestParam String nickname) {
        List<User> users = userService.getUsersByNickname(nickname);
        return new ResultDTO<>(200, "查询成功", users);
    }

    /**
     * 获取所有用户信息
     */
    @GetMapping("/all")
    public ResultDTO<List<User>> getAllUsers() {
        List<User> users = userService.getAllUsers();
        return new ResultDTO<>(200, "查询成功", users);
    }

    /**
     * 创建新用户
     */
    @PostMapping
    public ResultDTO<User> createUser(@RequestBody User user) {
        User savedUser = userService.saveUser(user);
        if (savedUser != null) {
            return new ResultDTO<>(200, "用户创建成功", savedUser);
        } else {
            return new ResultDTO<>(500, "用户创建失败", null);
        }
    }

    /**
     * 更新用户信息
     */
    @PutMapping("/{id}")
    public ResultDTO<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        boolean updated = userService.updateUser(user);
        if (updated) {
            // 更新成功后重新查询用户信息返回
            User updatedUser = userService.getUserById(id);
            return new ResultDTO<>(200, "用户更新成功", updatedUser);
        } else {
            return new ResultDTO<>(500, "用户更新失败", null);
        }
    }

    /**
     * 删除用户
     */
    @DeleteMapping("/{id}")
    public ResultDTO<Void> deleteUser(@PathVariable Long id) {
        boolean deleted = userService.deleteUser(id);
        if (deleted) {
            return new ResultDTO<>(200, "用户删除成功", null);
        } else {
            return new ResultDTO<>(500, "用户删除失败", null);
        }
    }

    // ========== JDBC 报错示例接口 ==========

    /**
     * 故意触发SQL语法错误的接口
     * 访问路径: GET /api/user/error/sql-syntax
     */
    @GetMapping("/error/sql-syntax")
    public ResultDTO<List<User>> testSqlSyntaxError() {
        try {
            List<User> users = userService.testSqlSyntaxError();
            return new ResultDTO<>(200, "查询成功", users);
        } catch (Exception e) {
            return new ResultDTO<>(500, "SQL语法错误: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发表不存在错误的接口
     * 访问路径: GET /api/user/error/table-not-exists
     */
    @GetMapping("/error/table-not-exists")
    public ResultDTO<List<User>> testTableNotExistsError() {
        try {
            List<User> users = userService.testTableNotExistsError();
            return new ResultDTO<>(200, "查询成功", users);
        } catch (Exception e) {
            return new ResultDTO<>(500, "表不存在错误: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发字段不存在错误的接口
     * 访问路径: GET /api/user/error/column-not-exists
     */
    @GetMapping("/error/column-not-exists")
    public ResultDTO<List<User>> testColumnNotExistsError() {
        try {
            List<User> users = userService.testColumnNotExistsError();
            return new ResultDTO<>(200, "查询成功", users);
        } catch (Exception e) {
            return new ResultDTO<>(500, "字段不存在错误: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发数据类型转换错误的接口
     * 访问路径: GET /api/user/error/data-type/{invalidId}
     */
    @GetMapping("/error/data-type/{invalidId}")
    public ResultDTO<User> testDataTypeError(@PathVariable String invalidId) {
        try {
            User user = userService.testDataTypeError(invalidId);
            return new ResultDTO<>(200, "查询成功", user);
        } catch (Exception e) {
            return new ResultDTO<>(500, "数据类型转换错误: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发违反唯一约束错误的接口
     * 访问路径: POST /api/user/error/duplicate
     */
    @PostMapping("/error/duplicate")
    public ResultDTO<User> testDuplicateKeyError(@RequestBody User user) {
        try {
            User savedUser = userService.testDuplicateKeyError(user);
            return new ResultDTO<>(200, "用户创建成功", savedUser);
        } catch (Exception e) {
            return new ResultDTO<>(500, "违反唯一约束错误: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发数据库连接超时错误的接口
     * 访问路径: GET /api/user/error/connection-timeout
     */
    @GetMapping("/error/connection-timeout")
    public ResultDTO<List<User>> testConnectionTimeoutError() {
        try {
            List<User> users = userService.testConnectionTimeoutError();
            return new ResultDTO<>(200, "查询成功", users);
        } catch (Exception e) {
            return new ResultDTO<>(500, "数据库连接超时: " + e.getMessage(), null);
        }
    }

    /**
     * 故意触发死锁错误的接口
     * 访问路径: POST /api/user/error/deadlock
     */
    @PostMapping("/error/deadlock")
    public ResultDTO<String> testDeadlockError() {
        try {
            String result = userService.testDeadlockError();
            return new ResultDTO<>(200, "操作成功", result);
        } catch (Exception e) {
            return new ResultDTO<>(500, "数据库死锁错误: " + e.getMessage(), null);
        }
    }

    // ========== 拦截器测试接口 ==========

    /**
     * 测试拦截器效果的接口
     * 访问路径: GET /api/user/test/interceptor
     */
    @GetMapping("/test/interceptor")
    public ResultDTO<String> testInterceptor() {
        return new ResultDTO<>(200, "这是一个测试消息", "拦截器正在工作！");
    }

    /**
     * 测试不同类型消息的拦截器效果
     * 访问路径: GET /api/user/test/interceptor/{type}
     */
    @GetMapping("/test/interceptor/{type}")
    public ResultDTO<String> testInterceptorWithType(@PathVariable String type) {
        switch (type) {
            case "success":
                return new ResultDTO<>(200, "操作成功完成", "成功的数据");
            case "error":
                return new ResultDTO<>(500, "操作失败了", null);
            case "warning":
                return new ResultDTO<>(400, "请注意这个警告", "警告数据");
            default:
                return new ResultDTO<>(200, "未知类型的消息", "默认数据");
        }
    }
}
